package co.edu.udea.iw.tusanimes.dao.impl;

import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Restrictions;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import co.edu.udea.iw.tusanimes.dao.ComentarioPublicacionDao;
import co.edu.udea.iw.tusanimes.dao.exception.DAOException;
import co.edu.udea.iw.tusanimes.dto.ComentarioPublicacion;


/**
 * Implemetaci�n de la Interfaz ComentarioPublicacionDao
 * 
 * @author Johan Torres
 * @version 1.0F
 * 
 */
public class ComentarioPublicacionDaoImpl extends HibernateDaoSupport implements ComentarioPublicacionDao {

	/**
	 * Crear un nuevo comentario.
	 * 
	 * @param comentario
	 *            comentario a guardar.
	 * @return ComentarioPublicacion comentario creado.
	 * @throws DAOException
	 */
	@Override
	public ComentarioPublicacion crearComentario(
			ComentarioPublicacion comentario) throws DAOException {
		Session session = null;
		Transaction tx = null;

		try {
			session = getSession();
			tx = session.beginTransaction();

			session.save(comentario);
			tx.commit();
		} catch (HibernateException e) {
			e.printStackTrace();
			throw new DAOException();
		}
		return comentario;
	}

	/**
	 * Actualizar un comentario.
	 * 
	 * @param comentario
	 *            comentario a actulizar.
	 * @throws DAOException
	 */
	@Override
	public void actualizarComentario(ComentarioPublicacion comentario)
			throws DAOException {
		Session session = null;
		Transaction tx = null;

		try {
			session = getSession();
			tx = session.beginTransaction();

			session.update(comentario);
			tx.commit();
		} catch (HibernateException e) {
			throw new DAOException();
		}
	}

	/**
	 * Eliminar un comentario.
	 * 
	 * @param String
	 *            nombreDeUsuario Usuario que creo el comentario.
	 * @param idPublicacion
	 *            ID de la publicaci�n a eliminar.
	 * @param clasePublicacion
	 *            Clase del tipo de publicaci�n.
	 * @throws DAOException
	 */
	@Override
	public void eliminarComentario(int idComentaioPublicacion)
			throws DAOException {
		Session session = null;
		Transaction tx = null;
		Query query = null;
		String sql;

		try {
			sql = "delete from ComentarioPublicacion where idComentarioPublicacion= :idComentarioPublicacion";
			session = getSession();
			tx = session.beginTransaction();
			query = session.createQuery(sql);

			query.setInteger("idComentarioPublicacion", idComentaioPublicacion);
			query.executeUpdate();
			tx.commit();
		} catch (HibernateException e) {
			throw new DAOException();
		}
	}

	/**
	 * Buscar comentario en una publicaci�n.
	 * 
	 * @param nombreDeUsuario
	 *            Usuario que creo el comentario.
	 * @param idPublicacion
	 *            ID de la publicaci�n en la que se busca.
	 * @param clasePublicacion
	 *            Clase del tipo de publicaci�n.
	 * @throws DAOException
	 */
	@Override
	public ComentarioPublicacion buscarComentarioById(
			int idComentarioPublicacion) throws DAOException {
		Session session = null;
		ComentarioPublicacion comentario = null;

		try {
			session = getSession();

			comentario = (ComentarioPublicacion) session
					.createCriteria(ComentarioPublicacion.class)
					.add(Restrictions.eq("id", idComentarioPublicacion))
					.uniqueResult();

		} catch (HibernateException e) {
			throw new DAOException();
		}

		return comentario;
	}

}
